14 AGT 基本定时器实验

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
AGT 基本定时器实验
本章目标:
- 了解 RA6M5 处理器的 AGT 外设;
- 学会使用 RASC 配置 AGT 实现基本定时;
硬件设计
(略,参见配套硬件原理图)
软件设计
新建工程
复制一份“07 SCI-UART_Recv_send”修改文件夹名“14 AGT_Basic_Timer”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 agt_timer.c 和 agt_timer.h,保存到目录下的 \src 文件夹下。
FSP 配置
Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。
打开 FSP 配置界面,在 Stacks 中添加 AGT 模块。

使用 AGT0 来定时并触发中断实现定时器功能,需要修改的只有“General”和“Interrupts”部分,其他按照默认即可。

General 属性:
| 属性 | 描述 |
|---|---|
| General > Name | 模块名字。 |
| General > Channel | 通道选择。指定硬件通道,也就是指定使用哪一个 AGT 定时器。 |
| General > Mode | 可以选择周期计数、单次计数、PWM 模式。 Periodic One-Shot(该模式使用软件来实现,即使不设置中断回调函数也必须开启相应的中断) PWM 模式 |
| General > Period | 周期。 |
| General > Period Unit | 周期的单位。 |
| General > Count Source | AGT 计数器的时钟源。注:分频器会基于用户设置的周期由软件自动调节。 |
配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击 “Generate Project Content” 按钮,让软件自动生成配置代码即可。
程序设计
实现 AGT 的基本定时器功能,开启 1s 的定时器中断,周期翻转 LED,实现 LED 的闪烁。
- 打开 AGT 设备
R_AGT_Open(timer_ctrl_t * const p_ctrl, timer_cfg_t const * const p_cfg);
p_ctrl:timer_ctrl_t 结构体指针参数,本质是一个 void 类型的参数,指向 st_gpt_instance_ctrl 类型变量;
p_cfg:timer_cfg_t 结构体指针参数,在程序中会指向在 hal_data.c 中定义的 g_timer_cfg 静态全局变量;
- 开启/停止 AGT 计数
R_AGT_Start(timer_ctrl_t * const p_ctrl);
R_AGT_Stop(timer_ctrl_t * const p_ctrl);
必须要在 AGT 打开状态下使用这两个函数。
- 定时器中断,判断周期 END 标志。
//定时器溢出 中断回调函数
void agt0_timer_callback(timer_callback_args_t * p_args)
{
if (TIMER_EVENT_CYCLE_END == p_args->event)
{
LED1_TOGGLE();
}
}
程序编写
在 agt_timer.h 头文件里定义初始化函数。
#ifndef __BSP_AGT__H
#define __BSP_AGT__H
#include "hal_data.h"
void agt_Timer_Init(void);
#endif
在 agt_timer.c 里实现初始化函数、中断函数。
回调函数里面使用 if 语句判断触发中断的事件是否是定时器溢出事件,若是定时器溢出事件则翻转一次 LED1 引脚的电平。
#include "agt_timer.h"
#include "led.h"
//AGT初始化函数
void agt_Timer_Init(void)
{
//初始化AGT模块
R_AGT_Open(&g_timer_agt0_ctrl, &g_timer_agt0_cfg);
//启动定时器
R_AGT_Start(&g_timer_agt0_ctrl);
}
//定时器溢出中断回调函数
void agt0_timer_callback(timer_callback_args_t * p_args)
{
if (TIMER_EVENT_CYCLE_END == p_args->event)
{
LED1_TOGGLE();
}
}
在 hal_entry.c 文件中添加头文件 agt_timer.h,在 hal_entry 入口函数初始化 AGT。
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init();
uart0_Init();
agt_Timer_Init();
printf("start agt basic test\r\n");
while(1)
{
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完成后,观察实验结果。
LED 灯 1s 周期闪烁。